﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using QLPKWeb.Models.LinQ.Common;

using QLPKWeb.Models.LinQ.Error;

using Webdiyer.WebControls.Mvc;
using DONGACS.Common;
using TB_Department = QLPKWeb.Models.LinQ.Common.TB_Department;
using TB_User = QLPKWeb.Models.LinQ.Common.TB_User;


namespace QLPKWeb.BussinessDelegate.CommonDelegate
{
    public class CommonDelegate : Controller
    {
        DBErrorDataContext DBError = new DBErrorDataContext();
        DBCommonDataContext DBCommon = new DBCommonDataContext();
       

        #region Hàm Liên quan tới Ghi nhận lỗi hệ thống
        //Ghi nhận lại thông tin lỗi phát hiện khi sử dụng hệ thống
        public void GhiNhanLoi(Exception e, string url)
        {
            string[] urlItems = url.Split('/');

            //string action = urlItems[urlItems.Count() - 1].Split('?')[0];
            string action = urlItems[4].Split('?')[0];

            var error = new TB_Error
                            {
                                UserID = Convert.ToInt32(Session["USERID"]),
                                CreateDate = DateTime.Now,
                                Message =  e.Message + " | " + e.StackTrace,
                                //Module = urlItems[urlItems.Count() - 2],
                                Module = urlItems[3],
                                Action = action,
                                Url = url
                            };
            DBError.TB_Errors.InsertOnSubmit(error);
            DBError.SubmitChanges();
        }
 #endregion


#region Hàm Liên quan tới table TB_Users
        //hàm lấy giới tính của user
        public bool GetSexForUser(int idUser)
        {
            try
            {
                return Convert.ToBoolean(DBCommon.TB_Users.Single(p => p.ID == idUser).Sex);
            }
            catch (Exception)
            {
                return true;
            }
        }

        // Lấy tất cả user đang hoặt động trong hệ thống
        public IList<TB_User> GetAllUsers()
        {
            return DBCommon.TB_Users.Where(p => p.IsActive == true && p.IsDelete == false).OrderBy(p => p.LastName).ThenBy(p => p.FirstName).ToList();
        }
        
        /// <summary>
        /// Lấy Top Users theo số lượng
        /// </summary>
        /// <param name="SoLuong">số lượng user cần lấy</param>
        /// <returns>Danh sách top user theo Số lượng</returns>
        public IList<TB_User> GetUsersTheoSoLuongOrderByname(int SoLuong)
        {
            return DBCommon.TB_Users.Where(p => p.IsActive == true && p.IsDelete == false).Take(SoLuong).OrderBy(p => p.LastName).ThenBy(p => p.FirstName).ToList();
        }

        //Lấy những user thuộc department có Id = departmentId
        public IEnumerable<TB_User> GetUsersByDepartmenId(string departmentId)
        { 
            return DBCommon.TB_Users.Where(p => p.Department == Convert.ToInt32(departmentId)
                && p.IsDelete == false && p.IsActive == true).OrderByDescending(p => p.JobTitle).ToList();
        }

        //Lấy những user thuộc department có Id = departmentId
        public IEnumerable<TB_User> GetUsersByDepartmenIdOrderByName(string departmentId)
        {
            return DBCommon.TB_Users.Where(p => p.Department == Convert.ToInt32(departmentId)
                && p.IsDelete == false && p.IsActive == true).OrderBy(p => p.LastName).ThenBy(p=>p.FirstName).ToList();
        }

        public IList<TB_User> LayUSERPhongBan(string departmentId)
        {
            return DBCommon.TB_Users.Where(p => p.Department == Convert.ToInt32(departmentId)
                && p.IsDelete == false && p.IsActive == true).OrderByDescending(p => p.JobTitle).ToList();
        }

        // Lấy những user không thuộc Departmet nào
        public IList<TB_User> GetAllUsersNotDepartment()
        {
            return DBCommon.TB_Users.Where(p => p.Department == null).ToList();
        }

        // Lấy danh sách User là trưởng phòng
        public IList<TB_User> GetAllUsersIsChef()
        {
            List<TB_Department> ListDep = this.GetAllDepartments().OrderBy(p => p.DepartmentName).ToList();
            List<TB_User> ListUser = new List<TB_User>();
            foreach (TB_Department item in ListDep)
            {
                if (item.IdChief != null && item.IdChief.Value > 0)
                {
                    TB_User objUser = this.GetUserByUserId(item.IdChief.ToString());
                    if (objUser != null && objUser.ID > 0)
                        ListUser.Add(objUser);
                }
            }
            return ListUser;
        }

     
        // lấy display name của phòng ban hoặc user lên cây quy trinh
        public string GetDisplayNameUserToTreeView(int? IdXuLy, char? UserType)
        {
            string kq = "";
            if (UserType != null && UserType.Value == 'u')
            {
                TB_User user = DBCommon.TB_Users.Single(p => p.ID == Convert.ToInt32(IdXuLy));

                TB_Department objdep = user.Department != null ? this.GetDepartmentByDepartmentId(user.Department.ToString()) : null;
                QLPKWeb.Models.LinQ.Common.TB_JobTitle objJob = user.JobTitle != null ? this.GetJobTitleByJobTitleId(user.JobTitle.Value.ToString()) : null;
                kq = ((string.IsNullOrEmpty(user.LastName) || string.IsNullOrEmpty(user.FirstName))
                                  ? user.UserName
                                  : user.LastName + " " + user.FirstName)
                 + "(" + (objJob != null ? objJob.JobTitle : "") + "-" + (objdep != null ? objdep.DepartmentName : "") + ")";
            }
            else if (UserType != null && UserType.Value == 'd')
            {
                //TB_Department objDep = DBCommon.TB_Departments.SingleOrDefault(p => p.ID == IdXuLy);
                //kq = objDep.DepartmentName;
                TB_Department objDep = this.GetDepartmentByDepartmentId(IdXuLy.ToString());
                //TB_User obj = this.GetUserByUserId(objDep.IdChief != null ? objDep.IdChief.ToString() : "0");
                TB_User user = new TB_User();//this.GetUserByUserId(objDep.IdChief != null ? objDep.IdChief.ToString() : "0");
                if (objDep.IdChief != null)
                {
                    user = this.GetUserByUserId(objDep.IdChief.Value.ToString());
                    QLPKWeb.Models.LinQ.Common.TB_JobTitle objJob = user.JobTitle != null ? this.GetJobTitleByJobTitleId(user.JobTitle.Value.ToString()) : null;
                    kq = ((string.IsNullOrEmpty(user.LastName) || string.IsNullOrEmpty(user.FirstName))
                                   ? user.UserName
                                   : user.LastName + " " + user.FirstName)
                            + "(" + (objJob != null ? objJob.JobTitle : "") + "-" + objDep.DepartmentName + ")";
                }
                else
                {
                    kq = objDep.DepartmentName;
                }
            }
            return kq;
        }

        public TB_User GetUserToTreeView(int? IdXuLy, char? UserType)
        {
            string kq = "";
            if (UserType != null && UserType.Value == 'u')
            {
                TB_User user = DBCommon.TB_Users.Single(p => p.ID == Convert.ToInt32(IdXuLy));

                return user;
            }
            else if (UserType != null && UserType.Value == 'd')
            {
                TB_Department objDep = DBCommon.TB_Departments.SingleOrDefault(p => p.ID == IdXuLy);
                if (objDep.IdChief!=null&&objDep.IdChief.Value>0)
                {
                    TB_User user = DBCommon.TB_Users.Single(p => p.ID == Convert.ToInt32(objDep.IdChief));
                    return user;
                }
            }
            return new TB_User();
        }

        public TB_User GetUserNameByUserId(string userId)
        {
            try
            {
                return DBCommon.TB_Users.Single(p => p.ID == Convert.ToInt32(userId));
            }
            catch (Exception)
            {
                return new TB_User();
            }
        }
        
        public TB_User GetUserByUserId(string userId)
        {
            try
            {
                return DBCommon.TB_Users.Single(p => p.ID == Convert.ToInt32(userId));
               
            }
            catch (Exception)
            {
                return new TB_User();
            }
        }
        
        public string GetDisplayNameByUserId(string userId)
        {
            try
            {
                TB_User user = DBCommon.TB_Users.Single(p => p.ID == Convert.ToInt32(userId));

               string DisplayName = (string.IsNullOrEmpty(user.LastName) || string.IsNullOrEmpty(user.FirstName))
                                 ? user.UserName
                                 : user.LastName + " " + user.FirstName;

                return DisplayName;
            }
            catch (Exception)
            {
                return string.Empty;
            }
        }
        public string GetDisplayNameAndDepNameByUserId(string userId)
        {
            try
            {
                TB_User user = DBCommon.TB_Users.Single(p => p.ID == Convert.ToInt32(userId));
                TB_Department objdep = user.Department != null ? this.GetDepartmentByDepartmentId(user.Department.ToString()) : null;
                QLPKWeb.Models.LinQ.Common.TB_JobTitle objJob = user.JobTitle != null ? this.GetJobTitleByJobTitleId(user.JobTitle.Value.ToString()) : null;

                string DisplayName = ((string.IsNullOrEmpty(user.LastName) || string.IsNullOrEmpty(user.FirstName))
                                  ? user.UserName
                                  : user.LastName + " " + user.FirstName)
                                  + "(" + (objdep != null ? objdep.DepartmentName : "") + ", " + (objJob != null ? objJob.JobTitle : "") + ")";

                return DisplayName;
            }
            catch (Exception)
            {
                return string.Empty;
            }
        }

#endregion
        // lấy display image của phòng ban hoặc user lên cây quy trinh
        public string GetDisplayImageUserToTreeView(int? IdXuLy, char? UserType)
        {
            string kq = "";
            if (UserType != null && UserType.Value == 'u')
            {
                TB_User user = DBCommon.TB_Users.Single(p => p.ID == Convert.ToInt32(IdXuLy));
                kq = this.GetSexForUser(user.ID) ? "../../Content/ImagesAdmin/User.png" : "../../Content/ImagesAdmin/User_Female.png";
            }
            else if (UserType != null && UserType.Value == 'd')
            {
                TB_Department objDep = this.GetDepartmentByDepartmentId(IdXuLy.ToString());
                kq = objDep.IdChief == null ? "../../Content/ImagesAdmin/User.png" :
                    this.GetSexForUser(objDep.IdChief.Value) ? "../../Content/ImagesAdmin/User.png" : "../../Content/ImagesAdmin/User_Female.png";
            }
            return kq;
        }

#region Hàm liên quan tới table TB_Departments
        
        public TB_Department GetDepartmentByDepartmentId(string departmentId)
        {
            return DBCommon.TB_Departments.SingleOrDefault(p => p.ID == Convert.ToInt32(departmentId));
        }



        public IList<TB_Department> GetAllDepartments()
        {
            return DBCommon.TB_Departments.Where(p => p.IsDelete == false).ToList();
        }

        public IList<TB_Department> GetDepartmentsTheoSoLuong(int SoLuong)
        {
            return DBCommon.TB_Departments.Where(p => p.IsDelete == false).Take(SoLuong).ToList();
        }
#endregion

        #region Hàm liên quan đến jobtitle

        public QLPKWeb.Models.LinQ.Common.TB_JobTitle GetJobTitleByJobTitleId(string JobtitleId)
        {
            try
            {
                return DBCommon.TB_JobTitles.Single(p => p.ID == Convert.ToInt32(JobtitleId));
            }
            catch (Exception)
            {
                
                return  null;
            }
            
        }

        #endregion


      


#region hàm liên quan tới bảng CoQuanXuDung
        public dm_CoQuanSuDung GetCoQuanSuDung()
        {
            try
            {
                return DBCommon.dm_CoQuanSuDungs.ToList()[0];
            }
            catch (Exception)
            {
                return null;
            }
        }

#endregion


        #region Hàm liên quan tới datetime

        public DateTime FixDate(DateTime date, int type)
        {
            string strdate = date.Year + "-" + date.Month + "-" + date.Day;
            strdate += type == 1 ? " 00:00:00" : " 23:59:00";
            return DateTime.Parse(strdate);
        }

        public DateTime? ConvertToDateTine(string strDate)// strDate=dd/mm/yyyy
        {
            string[] arr = strDate.Split('/');
            if (arr.Length != 3)
                return null;
            else
            {
                string converdate = arr[2] + "-" + arr[1] + "-" + arr[0];
                return DateTime.Parse(converdate);
            }
        }

        public DateTime? ConverToTime(string strTime) // strTime="hh:mm:ss"
        {
            string[] arr = strTime.Split(':');
            if (arr.Length != 3)
                return null;
            else
            {
                DateTime date = DateTime.Parse(DateTime.Today.ToString("yyyy-MM-dd") + " " + strTime);
                return date;
            }
        }

        public DateTime? ConverToTime(string HH, string mm)
        {
            string time = HH + ":" + mm + ":" + "00";
            return ConverToTime(time);
        }

        //Phan em viet them
        public DateTime? ConvertTime(string Date, string strTime) 
        {
            string[] arr1 = Date.Split('/');
            string[] arr2 = strTime.Split(':');

            string converdate = arr1[2] + "-" + arr1[1] + "-" + arr1[0];
            DateTime date = DateTime.Parse(converdate + " " + strTime);
            return date;
        }


        #region Một số hàm hữu ích

        //Sắp xếp mảng user tăng theo giá trị tăng của mảng phụ
        public void SapXepTangDan(TB_User[] arrayUser, double[] arrayXuLyTemp)
        {
            for (int i = 0; i < arrayXuLyTemp.Count() - 1; i++)
            {
                for (int j = i + 1; j < arrayXuLyTemp.Count(); j++)
                {
                    if(arrayXuLyTemp[j] < arrayXuLyTemp[i])
                    {
                        //thay đổi vị trí mảng tạm
                        double bufferForArray = arrayXuLyTemp[i];
                        arrayXuLyTemp[i] = arrayXuLyTemp[j];
                        arrayXuLyTemp[j] = bufferForArray;

                        //thay đổi vị trí danh sách chính : userlist
                        TB_User bufferForList = arrayUser[i];
                        arrayUser[i] = arrayUser[j];
                        arrayUser[j] = bufferForList;
                    }
                }
            }
        }

        //Sắp xếp mảng user giảm theo giá trị giảm của mảng phụ
        public void SapXepGiamDan(TB_User[] arrayUser, double[] arrayXuLyTemp)
        {
            for (int i = 0; i < arrayXuLyTemp.Count() - 1; i++)
            {
                for (int j = i + 1; j < arrayXuLyTemp.Count(); j++)
                {
                    if (arrayXuLyTemp[j] > arrayXuLyTemp[i])
                    {
                        //thay đổi vị trí mảng tạm
                        double bufferForArray = arrayXuLyTemp[i];
                        arrayXuLyTemp[i] = arrayXuLyTemp[j];
                        arrayXuLyTemp[j] = bufferForArray;

                        //thay đổi vị trí danh sách chính : userlist
                        TB_User bufferForList = arrayUser[i];
                        arrayUser[i] = arrayUser[j];
                        arrayUser[j] = bufferForList;
                    }
                }
            }
        }
        
        //Sắp xếp mảng department tăng theo giá trị tăng của mảng phụ
        public void SapXepTangDan(TB_Department[] arrayUser, double[] arrayXuLyTemp)
        {
            for (int i = 0; i < arrayXuLyTemp.Count() - 1; i++)
            {
                for (int j = i + 1; j < arrayXuLyTemp.Count(); j++)
                {
                    if(arrayXuLyTemp[j] < arrayXuLyTemp[i])
                    {
                        //thay đổi vị trí mảng tạm
                        double bufferForArray = arrayXuLyTemp[i];
                        arrayXuLyTemp[i] = arrayXuLyTemp[j];
                        arrayXuLyTemp[j] = bufferForArray;

                        //thay đổi vị trí danh sách chính : userlist
                        TB_Department bufferForList = arrayUser[i];
                        arrayUser[i] = arrayUser[j];
                        arrayUser[j] = bufferForList;
                    }
                }
            }
        }

        //Sắp xếp mảng Department giảm theo giá trị giảm của mảng phụ
        public void SapXepGiamDan(TB_Department[] arrayUser, double[] arrayXuLyTemp)
        {
            for (int i = 0; i < arrayXuLyTemp.Count() - 1; i++)
            {
                for (int j = i + 1; j < arrayXuLyTemp.Count(); j++)
                {
                    if (arrayXuLyTemp[j] > arrayXuLyTemp[i])
                    {
                        //thay đổi vị trí mảng tạm
                        double bufferForArray = arrayXuLyTemp[i];
                        arrayXuLyTemp[i] = arrayXuLyTemp[j];
                        arrayXuLyTemp[j] = bufferForArray;

                        //thay đổi vị trí danh sách chính : userlist
                        TB_Department bufferForList = arrayUser[i];
                        arrayUser[i] = arrayUser[j];
                        arrayUser[j] = bufferForList;
                    }
                }
            }
        }

#endregion


        #region Phần Phân trang

        /// <summary>
        /// Chuyển paging sang tiếng việt
        /// </summary>
        /// <param name="pagerOptions">PagerOptions muốn thay đổi thuộc tính</param>
        /// <param name="PageIndexParameterName">Tên đặt của chỉ số trang</param>
        public void ChangeTextPaging(PagerOptions pagerOptions, string PageIndexParameterName)
        {
            pagerOptions.PageIndexParameterName = string.IsNullOrEmpty(PageIndexParameterName) ? "id" : PageIndexParameterName;
            pagerOptions.NextPageText = "Tiếp";
            pagerOptions.PrevPageText = "Lùi";
            pagerOptions.FirstPageText = "Đầu";
            pagerOptions.LastPageText = "Cuối";
            pagerOptions.CurrentPageNumberFormatString = "[{0}]";
        }


        #endregion


    }
}
        #endregion